package fr.greta.centre.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.naming.NamingException;

import fr.greta.centre.metier.Candidat;
import fr.greta.centre.metier.Connexion;
/**
 * <b>ConnexionDAOImpl est la classe impl�mentation de l'interface ConnexionDAO.</b>
 * <p>
 * Cette classe r�definie les m�thodes suivantes :
 * <ul>
 * <li>save() .</li>
 * <li>delete() .</li>
 * <li>findByKey() .</li>
 * <li>findAll() .</li>
 * <li>findAllByCandidat() .</li>
 * </ul>
 * </p>
 * @see ConnexionDAO
 *
 * @author Charrad Amine
 */
public class ConnexionDAOImpl implements ConnexionDAO {
	/**
	 * La m�thode save() .
	 * <p>
	 * Cette m�thode prend la connexion pass�e en param�tre 
	 * et la persiste dans la base .
	 * </p>
	 *
	 * @param uneConnexion
	 *            La connexion � persister dans la base.
	 * 
	 */
	@Override
	public int save(Connexion uneConnexion) throws SQLException {
		
			String sql = "INSERT INTO connexion (id_connexion, id_candidat, debut_connexion, fin_connexion, ip_connexion, user_agent)"
					+ " VALUES (NULL,  "+uneConnexion.getCandidat().getId()+", '"+uneConnexion.getDebutConnexion()+"', '"+uneConnexion.getFinConnexion()+"','"+uneConnexion.getIpConnexion()+"', '"+uneConnexion.getUserAgent()+"')";
			Statement st;
			int i = 0;
			try{
				st = Bd.getConnect().createStatement();
				st.executeUpdate(sql);
				String ss = "SELECT MAX( id_connexion) AS LastID FROM connexion";
				ResultSet r = st.executeQuery(ss);
				r.next();
				i = r.getInt(1);
				uneConnexion.setIdConnexion(i);
				
			}
			catch (SQLException e) {
				e.printStackTrace();
				throw e;
			}
		return i;
	}
	/**
	 * La m�thode delete(int id) .
	 * <p>
	 * Cette m�thode prend l'identifiant de la connexion � supprimer 
	 * et l'efface de la base .
	 * </p>
	 *
	 * @param id   Identifaint de la connexion � supprimer de la base.
	 * 
	 */
	@Override
	public boolean delete(int id) throws SQLException {
		String sql = "delete from connexion where id_connexion= "+id;
		boolean succes=false;
		try {
			Connection connexion = Bd.getConnect();
			Statement st = connexion.createStatement();
			st.execute(sql);
			succes =true ;
			connexion.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return succes;
	}
	
	/**
	 * La m�thode findByKey(int id) .
	 * <p>
	 * Cette m�thode prend l'identifiant de la connexion � chercher 
	 * depuis la base .
	 * </p>
	 *
	 * @param id   Identifaint de la connexion � chercher dans la base.
	 *           
	 * @return la connexion trouv�e, et null si la connexion n'a pas �t� trouv�e.
	 */
	@Override
	public Connexion findByKey(int id) throws SQLException {
		String sql ="select * from connexion where id_connexion ="+id;
		Connexion uneConnexion =null;
		try{
			Statement st= Bd.getConnect().createStatement();
			ResultSet rs=st.executeQuery(sql);
			rs.next();
			CandidatDAO dao =new CandidatDAOImpl();
			Candidat uncandidat = dao.findByKey(rs.getInt("id_candidat"));
			uneConnexion = new Connexion(rs.getInt("id_connexion"), uncandidat, rs.getTimestamp("debut_connexion"), rs.getTimestamp("fin_connexion"), rs.getString("ip_connexion"), rs.getString("user_agent"));
			st.getConnection().close();
		}catch(SQLException e){
			e.printStackTrace();
		}
		return uneConnexion;
	}
	
	/**
	 * La m�thode findAllByCandidat (Candidat unCandidat)  .
	 * <p>
	 * Cette m�thode cherche les connexions d'un candidat
	 * pass� en param�tre .
	 * </p>
	 *
	 * @param unCandidat   le candidat pour lequel on veut r�cup�rer ses connexions.
	 *           
	 * @return liste des connexions du candidat.
	 */
	@Override
	public List<Connexion> findAllByCandidat(Candidat unCandidat) throws SQLException {
		List<Connexion> lesConnexions =new ArrayList<Connexion>();
		String sql = "select * from connexion where id_candidat = "+unCandidat.getId();
		Statement st;
		try{
			st = Bd.getConnect().prepareStatement(sql);
			ResultSet rs=st.executeQuery(sql);
			while (rs.next()){
				Connexion uneConnexion =new Connexion(rs.getInt("id_connexion"),
						unCandidat, rs.getTimestamp("debut_connexion"),
						rs.getTimestamp("fin_connexion"), rs.getString("ip_connexion"),
						rs.getString("user_agent"));
				lesConnexions.add(uneConnexion);
			}
			st.getConnection().close();
		}
		catch (SQLException e) {
			e.printStackTrace();
			throw e;
		}
		return lesConnexions;
	}
	
	/**
	 * La m�thode findAll()  .
	 * <p>
	 * Cette m�thode cherche toutes les connexions e tous les candidats.
	 * </p>
	 *
	 *           
	 * @return liste des connexions de tous les candidats.
	 */
	@Override
	public List<Connexion> findAll() throws SQLException {
		List<Connexion> lesConnexions =new ArrayList<Connexion>();
		String sql = "select * from connexion ";
		PreparedStatement st;
		try{
			st = Bd.getConnect().prepareStatement(sql);
			ResultSet rs=st.executeQuery(sql);
			while (rs.next()){
				CandidatDAOImpl dao =new CandidatDAOImpl();
				Candidat unCandidat = dao.findByKey(rs.getInt("id_candidat"));
				Connexion uneConnexion =new Connexion(rs.getInt("id_connexion"),
						unCandidat, rs.getTimestamp("debut_connexion"),
						rs.getTimestamp("fin_connexion"), rs.getString("ip_connexion"),
						rs.getString("user_agent"));
				lesConnexions.add(uneConnexion);
			}
			st.getConnection().close();
		}
		catch (SQLException e) {
			e.printStackTrace();
			throw e;
		}
		return lesConnexions;
	}

}
